package dou.net.protocol;

import com.google.protobuf.GeneratedMessageV3;
import dou.net.socket.IClientSocket;
import dou.net.socket.InvalidProtocolException;

import java.util.List;

/**
 * 协议对象接口
 * @author wizardc
 */
public interface IProtocol
{
    /**
     * 获取当前协议对象关心的所有消息 ID 列表
     * @return 当前协议对象关心的所有消息 ID 列表
     */
    List<Integer> msgIDList();

    /**
     * 注册一个消息处理对象
     * @param msgID 消息方法 ID
     * @param messageHandlerClass 消息处理对象类
     * @throws Exception 注册出错时抛出该异常
     */
    void registerMessageHandler(int msgID, Class<? extends IMessageHandler> messageHandlerClass) throws Exception;

    /**
     * 获取指定的消息处理对象
     * @param msgID 消息方法 ID
     * @return 消息处理对象
     * @throws IllegalAccessException 获取实例出错时抛出该异常
     * @throws InstantiationException 获取实例出错时抛出该异常
     */
    IMessageHandler getMessageHandler(int msgID) throws IllegalAccessException, InstantiationException;

    /**
     * 接收消息处理方法, 用于接收客户端发送的消息
     * @param msgID 消息 ID
     * @param msgNum 消息流水号
     * @param bytes 消息数据
     * @param socket 发送消息的客户端套接字对象
     * @throws InvalidProtocolException 当协议不正确时抛出该异常
     */
    void messageHandler(int msgID, int msgNum, byte[] bytes, IClientSocket socket) throws InvalidProtocolException;

    /**
     * 接收消息处理方法, 用于服务端内部发送的消息
     * @param msgID 消息 ID
     * @param msgNum 消息流水号
     * @param message 消息对象
     * @param socket 发送消息的客户端套接字对象
     * @throws InvalidProtocolException 当协议不正确时抛出该异常
     */
    void messageHandler(int msgID, int msgNum, GeneratedMessageV3 message, IClientSocket socket) throws InvalidProtocolException;

    /**
     * 清除本对象
     */
    void cleanup();
}
